home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network Supervisor's Toolkit
/
Network Supervisor's Toolkit.iso
/
tools
/
lu62
/
debug
/
ftt6.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-07-10
|
10KB
|
454 lines
/*
* CopyRight 1995. Nicholas Poljakov all rights reserved.
*/
#include <dos.h>
#include <bios.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define BORDER 1
#define REV_VID 0x70
#define NORM_VID 0x1E
#define MAX_FRAME 31
#define BKSP 8
#define F1 59
#define F2 60
#define F3 61
#define F4 62
#define F5 63
#define F6 64
#define F7 65
#define F8 66
#define F9 67
#define F10 68
#define HM 71 /* Home key */
#define UP 72 /* Up Arrow */
#define PU 73 /* Page Up */
#define LT 75 /* Left Arrow */
#define RT 77 /* Right Arrow */
#define END 79 /* End key */
#define DN 80 /* Down Arrow */
#define PD 81 /* Page Down */
#define ESC '\033'
#define DIR 0x10
#define ROWS1 19
#define ROWS2 23
#define ROWS 25
#define COLS 78
#define L_W 20
#define M_W 36
#define R_W 20
#define SCRNSIZE ((ROWS)*(COLS+2)*2)
#define LAST (24 * 80)*2
#define M0C 4 /* Files maping col.s */
#define M0L 14 /* Files maping rows */
#define M0F (((80 * 5) + 9)) * 2
#define INTR 18*2
extern unsigned char cur_off;
extern unsigned int attr1b;
extern unsigned int *ptrs;
extern int size;
extern unsigned char row, col;
extern int adapter;
extern unsigned char far *videomem;
extern int offset;
extern int sw;
extern char *path;
extern char file[12];
extern char tpname[31];
extern char luname[8];
extern char mode_name[8];
extern char rcv_file[12];
extern char dta[128];
extern char far *sv;
extern char far *vid_mem;
extern short cur_ln;
extern struct menu_frame {
int startx, endx, starty, endy;
unsigned char *p;
char **menu;
char *keys;
int border;
int count;
unsigned char attrib;
int active;
int curx, cury;
char *header;
unsigned char shd;
} frame[MAX_FRAME];
extern char p_dcl[21];
extern unsigned char dr_ind[80];
extern char c_pt[60];
extern int drive_ind[10];
sfs(t, f)
char far *t;
char far *f;
{
unsigned fs;
unsigned fo;
unsigned ts;
unsigned to;
fs = FP_SEG( f );
fo = FP_OFF( f );
ts = FP_SEG( t );
to = FP_OFF( t );
_asm {
push si
push di
push ds
mov si, word ptr fo[0]
mov di, word ptr to[0]
mov ax, word ptr ts[0]
mov es, ax
mov ax, word ptr fs[0]
mov ds, ax
mov cx, 2000
cld
rep movsw
pop ds
pop di
pop si
}
return 0;
}
window(num)
int num;
{
int choice, x, y;
int dl;
if (!frame[num].active) {
sfs(sv, vid_mem);
if (frame[num].shd) {
dl = 1;
}
else
dl = 0;
if ((frame[num].p = malloc(2*(frame[num].endx-frame[num].startx+1+dl)*(frame[num].endy-frame[num].starty+1+dl))) == NULL) {
return -1;
}
save_video(num);
if (frame[num].border) {
draw_border(num);
}
display_header(num);
x = frame[num].startx + frame[num].curx + 1;
y = frame[num].starty + frame[num].cury + 1;
goto_xy(x, y);
frame[num].active = 1;
}
return 0;
}
display_header(num)
int num;
{
register int y, len;
y = frame[num].starty;
len = strlen(frame[num].header);
if (len == 0) return 0;
len = (frame[num].endy - y - len) / 2;
if (len <= 0) {
return -1;
}
y = y + len;
write_string(frame[num].startx, y, frame[num].header, NORM_VID);
return 0;
}
deactivate(num)
int num;
{
if (frame[num].active) {
frame[num].curx = 0;
frame[num].cury = 0;
restore_video(num);
free(frame[num].p);
}
return 0;
}
window_xy(num, x, y)
int num, x, y;
{
if ((x<0)||(x+frame[num].startx >= frame[num].endx - 1)) {
return 0;
}
if ((y<0)||(y+frame[num].starty >= frame[num].endy - 1)) {
return 0;
}
frame[num].curx = x;
frame[num].cury = y;
if (!cur_off) {
goto_xy(frame[num].startx + x + 1, frame[num].starty + y + 1);
}
return 1;
}
unsigned window_getche(int num)
{
union inkey {
char ch[2];
unsigned i;
} c;
if (!frame[num].active) {
return 0;
}
window_xy(num, frame[num].curx, frame[num].cury);
c.i = _bios_keybrd( _KEYBRD_READ );
if (c.ch[0]) {
switch (c.ch[0]) {
case '\r' :
break;
case BKSP :
break;
case 0: return c.i;
default:
if (frame[num].cury+frame[num].starty < frame[num].endy-1) {
write_char(frame[num].startx+frame[num].curx+1,
frame[num].starty+frame[num].cury+1,
c.ch[0], frame[num].attrib);
frame[num].cury++;
}
}
if (frame[num].curx < 0) {
frame[num].curx = 0;
}
if (frame[num].curx+frame[num].startx > frame[num].endx-2) {
frame[num].curx--;
}
window_xy(num, frame[num].curx, frame[num].cury);
}
return c.i;
}
unsigned window_gets(int num, char *s)
{
char *temp;
union inkey {
char ch[2];
unsigned i;
} c;
temp = s;
for (;;) {
c.i = window_getche(num);
switch (c.ch[0]) {
case ESC :
if (s == temp) {
s++;
clear_back(temp, s, num);
return 1;
}
else {
s++;
while (s != temp) {
clear_back(temp, s, num);
s--;
}
}
break;
case '\r' :
*s = '\0';
return 0;
case BKSP :
clear_back(temp, s, num);
s--;
break;
case 0: return c.i;
default : *s = c.ch[0];
s++;
}
}
return 0;
}
clear_back(temp, s, num)
char *temp;
char *s;
int num;
{
if (s > temp) {
s--;
frame[num].cury--;
if (frame[num].cury < 0) {
frame[num].cury = 0;
}
window_xy(num, frame[num].curx, frame[num].cury);
write_char(frame[num].startx + frame[num].curx + 1,
frame[num].starty + frame[num].cury + 1, ' ',frame[num].attrib);
}
}
window_putchar(num, ch)
int num;
char ch;
{
register int x, y;
char far *v;
if (!frame[num].active) {
return 0;
}
x = frame[num].curx + frame[num].startx + 1;
y = frame[num].cury + frame[num].starty + 1;
v = vid_mem;
v += (x*160) + y*2;
if (y > frame[num].endy) {
return 1;
}
if (x > frame[num].endx) {
return 1;
}
if (ch == '\n') {
x++;
y = frame[num].startx + 1;
v = vid_mem;
v += (x*160) + y*2;
frame[num].curx++;
frame[num].cury = 0;
}
else
{
frame[num].cury++;
*v++ = ch;
*v++ = frame[num].attrib;
}
window_xy(num, frame[num].curx, frame[num].cury);
return 1;
}
window_puts(num, str)
int num;
char *str;
{
if (!frame[num].active) {
return 0;
}
for (; *str; str++) {
window_putchar(num, *str);
}
return 1;
}
window_cls(num)
int num;
{
register int i, j;
char far *v, far *t;
v = vid_mem;
t = v;
for (i = frame[num].startx+1; i < frame[num].endy; i++) {
for (j = frame[num].starty+1; j < frame[num].endx; j++) {
v = t;
v += (j*160) + i*2;
*v++ = ' ';
*v = NORM_VID;
}
}
frame[num].curx = 0;
frame[num].cury = 0;
}
window_cleol(num)
int num;
{
register int i, x, y;
x = frame[num].curx;
y = frame[num].cury;
window_xy(num, frame[num].curx, frame[num].cury);
for (i = frame[num].cury; i < frame[num].endy - 1; i++) {
window_putchar(num, ' ');
}
window_xy(num, x, y);
}
window_upline(num)
int num;
{
if (frame[num].curx > 0) {
frame[num].curx--;
window_xy(num, frame[num].curx, frame[num].cury);
return 1;
}
return 0;
}
window_downline(num)
int num;
{
if (frame[num].curx < (frame[num].endx - frame[num].startx - 1)) {
frame[num].curx++;
window_xy(num, frame[num].curx, frame[num].cury);
return 1;
}
return 1;
}
window_bksp(num)
int num;
{
if (frame[num].cury > 0) {
frame[num].cury--;
window_xy(num, frame[num].curx, frame[num].cury);
window_putchar(num, ' ');
frame[num].cury--;
window_xy(num, frame[num].curx, frame[num].cury);
}
return 0;
}
make_window(num, header, startx, starty, endx, endy, border, attrib, shi)
int num;
char *header;
int startx, starty, endx, endy;
int border;
unsigned char attrib, shi;
{
unsigned char *p;
int dl;
if (num > MAX_FRAME) {
return -1;
}
if ((startx>24)||(startx<0)||(starty>78)||(starty<0)) {
return -1;
}
if ((endx>24)||(endy>79)) {
return -1;
}
if (shi) {
dl = 1;
}
else
dl = 0;
frame[num].startx = startx;
frame[num].endx = endx;
frame[num].starty = starty;
frame[num].endy = endy;
frame[num].p = p;
frame[num].header = header;
frame[num].border = border;
frame[num].active = 0;
frame[num].attrib = attrib;
frame[num].curx = 0;
frame[num].cury = 0;
frame[num].shd = shi;
return 0;
}